//3.filter
//////filter用于过滤掉Array的某些元素，后返回剩余的元素。用filter()高阶函数，实现“筛选”

/////保留奇数删除偶数
var a=[1,2,3,4,5,6,7,8,9,10]
var a1=a.filter(function(x){
    return x % 2 !== 0   //返回奇数
})
console.log(a1);   //[1, 3, 5, 7, 9]

/////过滤掉空字符
var b=['A','','B',undefined,'C',null,' ']
var b1=b.filter(function(x){
    return x && x.trim()   //筛选空字符串
})
console.log(b1);  //["A", "B", "C"]

//回调函数
/////filter()可以接受回调函数，其实可以有多个参数，我们通常只用第一个参数表示筛选某个函数；其实可以接收其他两个参数，分别表示元素的位置和本身
var c=['a','b','c','d','e','f']
var c1=c.filter(function(x,y,z){
    //console.log(x);    //依次打印元素
    //console.log(y);    //依次打印索引
    console.log(z);      //依次打印数组本身
    return true;
})

////利用filter()去除重复函数
var d=['AA','BB','CC','DD','CC']
var d1=d.filter(function(x,y,z){
    return z.indexOf(x)===y      ///indexOf()总是返回第一个元素的位置，所以重复元素的索引与第一个元素索引不同，则被过滤掉
})
console.log(d1);  //["AA", "BB", "CC", "DD"]
console.log(d1.toString());  //AA,BB,CC,DD
///////上下效果一样
var 
    f,
    f1=['AA','BB','CC','DD','CC','GG']
    f=f1.filter(function(x,y,z){
        return z.indexOf(x)===y
    })
console.log(f.toString());

////////练习
'use strict';

function get_primes(arr) {
    var result=[]
    if(arr===1){return false}
    for (let i = 2; i <= parseInt(Math.sqrt(arr)); i++) {
        if(m % i === 0){return false}
    }
    return true
}
// 测试:
var
    x,
    r,
    arr = [];
for (x = 1; x < 100; x++) {
    arr.push(x);
}
r = get_primes(arr);
if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
    console.log('测试通过!');
} else {
    console.log('测试失败: ' + r.toString());
}






//4.sort
/////排序算法，是对几个元素进行排序，如果是字符串或者对象，在数学角度上排序是无意义的；通常规定，对于两个元素x和y，x<y则返回-1；x=y则返回0；x>y则返回1
console.log(['B','E','A','C','D'].sort());  //A,B,C,D,E
console.log(['b','E','a','C','D'].sort());  //C,D,E,a,b
console.log([10,15,1,35,28].sort());     //1,10,15,28,35
//第二个排序把apple排在了最后，是因为字符串根据ASCII码进行排序，而小写字母a的ASCII码在大写字母之后。
//第三个排序因为Array的sort()方法默认把所有元素先转换为String再排序，结果'10'排在了'2'的前面，因为字符'1'比字符'2'的ASCII码小。

//如果要对数字进行正序排序
var c=[500,6565,89,563]
console.log(c.sort(function(x,y){
    return x-y
}));   //上下两种都可以输出
var c1=c.sort(function(x,y){
    return x-y
})
console.log(c1);   //[89, 500, 563, 6565]
////或者用以下方法执行
var e=[5,2,5,8,6,10]
var e1=e.sort(function(x,y){
    if (x>y) {
        return 1
    }
    if (x<y) {
        return -1
    }
    else{return 0}
})
console.log(e1);  ///[2, 5, 5, 6, 8, 10]
console.log(e.sort(function(x,y){
    if(x>y){
        return 1
    }
    if(x<y){
        return -1
    }
    else{return 0}
}));
//若要进行倒序排序，则需把1和-1交换即可
var r=[5,2,2,86,13]
var r1=r.sort(function(x,y){
    if(x>y){
        return -1;
    }
    if(x<y){
        return 1;
    }else{
        return 0;
    }
})
console.log(r1);   //[86, 13, 5, 2, 2]


//对字母进行排序，不分大小写，只需要定义出忽略大小写的代码
var t=['E','a','B','c','d']
t.sort(function(t1,t2){
    x1=t1.toUpperCase()   //统一定义为大写
    x2=t2.toUpperCase()
    if(x1>x2){
        return 1
    }
    if(x1<x2){
        return -1
    }
    else{return 0}
})
console.log(t);


////////提示：sort会直接对Array进行修改，但返回的结果仍是当前对象Array
var q1=['B','A','C']
var q2=q1.sort();
console.log(q1);   //ABC
console.log(q2);   //ABC
console.log(q1===q2);    //true





//5.Array
//对于数组，除了map(),reduce,filter(),sort()这些可以传入函数外，Array还提供了很多非常实用的高阶函数

///every
//////every()可以判断数组的元素是否满足测试条件
var g=['Apple','Phone','banana']
var g1=g.every(function(x){
    return x.length>0
})
console.log(g1);   //判断数组元素是否满足x.length>0
/////上下两者代码原理相同
var u=['Apple','Phone','banana']
console.log(u.every(function(x){
    return x.toLowerCase()===x
}));   //判断数组元素是否全部都是小写（并非首字母），输出false



///find
///find()用于查找符合条件的第一个元素，若找到返回该元素；找不到返回underfined
var h=['Apple','Phone','banana']
console.log(h.find(function(x){
    return x.toLowerCase()===x
}));   //找到全是小写的字符串，输出banana
console.log(h.find(function(x){
    return x.toUpperCase()===x
}));   //找到全是大写的字母，没有返回underfined


///findIndex
///findIndex()和find()一样，都是查找第一个元素，和find()不同的是，findIndex()是返回索引，没有则返回-1
var i=['Apple','phone','Banana']
console.log(i.findIndex(function(x){
    return x.toLowerCase()===x;
}));   //找到全是小写phone，返回索引1
console.log(i.findIndex(function(x){
    return x.toUpperCase()===x;
}));   //没找到全是大写的字符串，返回-1



///forEach
///forEach()和map()类似，也是用于依次传入数组，但和map()不一样的是，forEach()不会返回新的数组
var o=['a','D','g','L']
o.forEach(console.log)